package com.cgnpc.cuddemo.workbench.controller;

import cn.com.cgnpc.aep.bizcenter.appcenter.sdk.client.RestClient;
import cn.com.cgnpc.aep.bizcenter.appcenter.sdk.result.ApiResult;
import com.alibaba.fastjson.JSONObject;
//import com.cgn.psc.entity.common.RequestCondition;
import com.cgnpc.cud.core.controller.BaseController;
import com.cgnpc.cud.core.domain.AjaxResult;
import com.cgnpc.framework.service.IBpmCenterService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/******************************
 * 用途说明: 流程中心前端控制器
 * 作者姓名: PXMWRYA
 * 创建时间: 2019/11/20 14:39
 ******************************/
@Slf4j
@Controller
@RequestMapping("psc/bpmCenter")
@Api(tags = "调用流程接口说明")
public class BpmCenterController extends BaseController{
//    @Autowired
//    RequestCondition requestCondition;

    @Autowired
    IBpmCenterService bpmCenterService;

    @Autowired
    RestClient restClient;


    /**********************************
    * 用途说明: 获取当前流程的初始节点
    * 参数说明 procId
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取当前流程的初始节点")
    @PostMapping("getStartAct")
    @ResponseBody
    public AjaxResult getStartAct(String procId){
        try{
            ApiResult apiResult = bpmCenterService.getStartAct(procId);
            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取流程实例所在节点的下一节点
    * 参数说明 procId
    * 参数说明 actMetadata
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "获取流程实例所在节点的下一节点")
    @PostMapping("getNextNode")
    @ResponseBody
    public AjaxResult getNextNode(String procId,String actMetadata){
        try{
            ApiResult apiResult = bpmCenterService.getNextNode(procId,actMetadata);
            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取流程当前处理人
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @PostMapping("queryApprovePerson")
    @ResponseBody
    public AjaxResult queryApprovePerson(@RequestBody Map paramsMap){
        try{
            ApiResult result = bpmCenterService.queryApprovePerson(paramsMap);
            return getObject(result);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取流程下一节点处理人
    * 参数说明 proc_id
    * 参数说明 node
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "获取流程下一节点处理人")
    @PostMapping("getApprovePerson")
    @ResponseBody
    public AjaxResult getApprovePerson(String proc_id,String node){
        try{
            ApiResult apiResult = bpmCenterService.getApprovePerson(proc_id,node);
            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取下一步处理人
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取下一步处理人")
    @PostMapping("/getNextApprovePerson")
    @ResponseBody
    public AjaxResult getNextApprovePerson(@RequestBody Map paramsMap){
        try{
            ApiResult result = bpmCenterService.getNextApprovePerson(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取流程实例所在节点的退回节点
    * 参数说明 procId
    * 参数说明 actMetadata
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "获取流程实例所在节点的退回节点")
    @PostMapping("getBackNode")
    @ResponseBody
    public AjaxResult getBackNode(String procId,String actMetadata){
        try{
            ApiResult apiResult = bpmCenterService.getBackNode(procId,actMetadata);
            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 发起一个流程
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="发起流程")
    @PostMapping("startProcInst")
    @ResponseBody
    public AjaxResult startProcess(@RequestBody String params){
        try{
            Map map = JSONObject.parseObject(params);
            ApiResult apiResult = bpmCenterService.startProcess(map);
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 通过流程全名去获取流程集信息
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="通过流程全名去获取流程集信息")
    @PostMapping("getProSetByFullName")
    @ResponseBody
    public AjaxResult getProcSetByFullName(@RequestBody String params){
        try{
            Map map = JSONObject.parseObject(params);
            String fullName = map.get("fullName").toString();
            ApiResult apiResult = bpmCenterService.getProcSetByFullName(fullName);
            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }


    /**********************************
    * 用途说明: 获取待办任务列表
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "获取待办任务列表")
    @PostMapping("getNeedDealTaskList")
    @ResponseBody
    public AjaxResult getNeedDealTaskList(@RequestBody String params){
        try {
            ApiResult apiResult = bpmCenterService.getWorkListItems(params);
            return getObject(apiResult);
        } catch (Exception e) {
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取办文跟踪
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取办文跟踪")
    @PostMapping("getWorkListItemTrace")
    @ResponseBody
    public AjaxResult getWorkListItemTrace(@RequestBody String params){
        try{
            Map map = JSONObject.parseObject(params);
            ApiResult ajaxResult = bpmCenterService.getWorkListItemTrace(map);
            return getObject(ajaxResult);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 提交流程
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "提交流程")
    @PostMapping("submitWorkListItem")
    @ResponseBody
    public AjaxResult submitworklistitem(@RequestBody String params){
        try{
            Map map = JSONObject.parseObject(params);
            //判断是前进还是后退
            String flag = map.get("deal_answer").toString();
            ApiResult apiResult = null;
            if("1".equals(flag)){
                apiResult = bpmCenterService.submitworklistitem(map);
            }
            else if("2".equals(flag)){
                apiResult = bpmCenterService.rollBackAction(map);
            }
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取线信息
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "获取线信息")
    @PostMapping("getWFConfigLine")
    @ResponseBody
    public AjaxResult getWFConfigLine(@RequestBody String params){
        try{
            ApiResult apiResult = bpmCenterService.getWFConfigLine(params);
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获得流程的节点列表
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取流程的节点列表")
    @PostMapping("getProcActList")
    @ResponseBody
    public AjaxResult getWFConfigActivity(@RequestBody String params){
        try{
            Map map = JSONObject.parseObject(params);
            ApiResult apiResult = bpmCenterService.getWFConfigActivity(map);
            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取流程版本
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "获取流程版本")
    @PostMapping("getWFConfigProc")
    @ResponseBody
    public AjaxResult getWFConfigProc(@RequestBody String params){
        try{
            ApiResult apiResult = bpmCenterService.getWFConfigProc(params);
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
     * 用途说明: 获取流程最新ProcID
     * 参数说明 params
     * 返回值说明:
     ***********************************/
    @ApiOperation(value = "获取流程最新ProcID")
    @PostMapping("getWFConfigProcID")
    @ResponseBody
    public AjaxResult getWFConfigProcID(@RequestBody String params){
        try{
            Map procID = bpmCenterService.getWFConfigProcID(params);
//            String jsonStr = JSONObject.toJSONString(apiResult);
            return getObject(procID);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }



    /**********************************
    * 用途说明: 请求调用查询流程实例
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "请求调用查询流程实例")
    @PostMapping("getProcessInfoList")
    @ResponseBody
    public AjaxResult getProcessInfoList(@RequestBody String params){
        try{
            ApiResult apiResult = bpmCenterService.getProcessInfoList(params);
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 返回调用查询流程实例
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "返回调用查询流程实例")
    @PostMapping("getBackProcessInfoList")
    @ResponseBody
    public  AjaxResult getBackProcessInfoList(@RequestBody String params){
        try{
            ApiResult apiResult = bpmCenterService.getBackProcessInfoList(params);
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 作废接口   表示这个流程不要了
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "作废接口")
    @PostMapping("cancelproc")
    @ResponseBody
    public AjaxResult cancelProc(@RequestBody String params){
        try{
            ApiResult apiResult = bpmCenterService.cancelProc(params);
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 回调接口
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "回调接口")
    @PostMapping("collBack")
    @ResponseBody
    public AjaxResult collBack(@RequestBody String params){
        try{
            ApiResult apiResult = bpmCenterService.collBack(params);
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 撤销接口
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "撤回接口")
    @PostMapping("withdraw")
    @ResponseBody
    public AjaxResult withdraw(@RequestBody String params){
        try{
            ApiResult apiResult = bpmCenterService.withdraw(params);
            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明:流程中心附件运行状态
    * 参数说明
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "流程中心附件运行状态")
    @GetMapping("imsBpmFileStatus")
    @ResponseBody
    public AjaxResult imsBpmFileStatus(){
        try{
            ApiResult apiResult = bpmCenterService.imsBpmFileStatus();
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明:流程中心健康检查
    * 参数说明
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "流程中心健康检查")
    @GetMapping("healthcheck")
    @ResponseBody
    public AjaxResult healthcheck(){
        try{
            ApiResult apiResult = bpmCenterService.healthCheck();
            String jsonStr = JSONObject.toJSONString(apiResult);
            return success(jsonStr);
        }catch(Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取已办
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "获取已办")
    @PostMapping("getDoneTaskList")
    @ResponseBody
    public AjaxResult getDoneTaskList(@RequestBody String params){
        try{
//            Map map = JSONObject.parseObject(params);
            ApiResult apiResult = bpmCenterService.getDoneTaskList(params);
            //DoneTaskResult doneTaskResult = bpmPscProcsetService.getDoneTaskList(map,requestCondition);
            //String message = JSONObject.toJSONString(doneTaskResult);

            return getObject(apiResult);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 增加全部代理
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="增加代理(所有流程)")
    @PostMapping("/addDelegates")
    @ResponseBody
    public AjaxResult addDelegates(@RequestBody String params){
        try{
            ApiResult result = bpmCenterService.addDelegates(params);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 新增代理
    * 参数说明 params
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="增加代理(指定流程)")
    @PostMapping("/addDelegate")
    @ResponseBody
    public AjaxResult addDelegate(@RequestBody String params){
        try{
            ApiResult result = bpmCenterService.addDelegate(params);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 待阅（不限流程状态）
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="待阅（不限流程状态）")
    @PostMapping("/getCopySendItemsListSecond")
    @ResponseBody
    public AjaxResult getCopySendItemsListSecond(@RequestBody Map paramsMap){
        try{
            ApiResult result = bpmCenterService.getCopySendItemsListSecond(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取待阅(抄送列表)
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取待阅(抄送列表)")
    @PostMapping("/getCopySendItemsList")
    @ResponseBody
    public AjaxResult getCopySendItemsList(@RequestBody Map paramsMap){
        try{
            ApiResult result = bpmCenterService.getCopySendItemsList(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 待阅提交 (抄送列表的提交)
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="待阅提交 (抄送列表的提交)")
    @PostMapping("/copySendItemSubmitSecond")
    @ResponseBody
    public AjaxResult copySendItemSubmitSecond(@RequestBody Map paramsMap){
        try{
            ApiResult result = bpmCenterService.copysenditemsubmitSecond(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取用户代理结果
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取用户代理结果(全部流程)")
    @PostMapping("/getdelegateusersettingresult")
    @ResponseBody
    public AjaxResult getDelegateListByUser(@RequestBody Map paramsMap)throws Exception{
        try{
            ApiResult result = bpmCenterService.getDelegateListByUser(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取代理结果
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取代理结果(指定流程)")
    @PostMapping("/getdelegatesettingresult")
    @ResponseBody
    public AjaxResult getdelegatesettingresult(@RequestBody Map paramsMap) throws Exception{
        try{
            ApiResult result = bpmCenterService.getDelegateList(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 删除用户代理设置
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="删除用户代理设置")
    @PostMapping("/delDelegateUserSetting")
    @ResponseBody
    public AjaxResult delDelegateUserSetting(@RequestBody Map paramsMap) throws Exception{
        try{
            ApiResult result = bpmCenterService.delDelegateUserSetting(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 删除代理设置
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "删除代理设置")
    @PostMapping("/deldelegatesetting")
    @ResponseBody
    public AjaxResult deldelegatesetting(@RequestBody Map paramsMap) throws Exception{
        try{
            ApiResult result = bpmCenterService.deldelegatesetting(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 分页查询我的草稿列表
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "分页查询我的草稿列表")
    @PostMapping("/getDraftListByPaging")
    @ResponseBody
    public AjaxResult getDraftListByPaging(@RequestBody Map paramsMap) throws Exception{
        try{
            ApiResult result = bpmCenterService.getDraftListByPaging(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 查询流程基本信息
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value = "查询流程基本信息")
    @PostMapping("/getBpmPscActInfo")
    @ResponseBody
    public AjaxResult getBpmPscActInfo(@RequestBody Map paramsMap) throws Exception{
        try{
            ApiResult result = bpmCenterService.getBpmPscActInfo(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取上一审批信息 通过查询某个流程实例的已办
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取上一审批信息")
    @PostMapping("/getLasApproveInfo")
    @ResponseBody
    public AjaxResult getLasApproveInfo(@RequestBody Map paramsMap) throws Exception{
        try{
            HashMap result = bpmCenterService.getLasApproveInfo(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取已阅列表
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @ApiOperation(value="获取已阅列表")
    @PostMapping("/getAlreadyReadList")
    @ResponseBody
    public AjaxResult getcopysenditemlogs(@RequestBody Map paramsMap) throws Exception{
        try{
            ApiResult result = bpmCenterService.getcopysenditemlogs(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }

    /**********************************
    * 用途说明: 获取所有节点信息
    * 参数说明 paramsMap
    * 返回值说明:
    ***********************************/
    @PostMapping("/getWFConfigActivity")
    @ResponseBody
    public AjaxResult getWFConfigActivity(@RequestBody Map paramsMap){
        try{
            ApiResult result = bpmCenterService.getWFConfigActivity(paramsMap);
            return getObject(result);
        }catch (Exception e){
            e.printStackTrace();
            return error(e.getMessage());
        }
    }
}